﻿namespace Lilium.Web.ReactiveHtml

type private HtmlTextWriterFormatter (writer : System.IO.TextWriter) =

    let tagStack = new System.Collections.Generic.Stack<string>()
    let mutable canSelfClose = true

    interface IHtmlFormatter with

        member self.openTag tag = 

            if (tagStack.Count <> 0) then writer.Write('>')       // завершаем родительский открывающий тег
            
            canSelfClose <- true    // тег на текущем уровне может быть самозакрываемым (пока не добавлены дочерние теги)

            let tagName = HtmlFormatterUtils.tagName tag 
            tagStack.Push(tagName)

            writer.Write('<')
            writer.Write (tagName)
            writer.Write(' ')
            self :> IHtmlFormatter
             
        member self.attribute attribute = 
            let (name, value) = HtmlFormatterUtils.attributeNameAndValue attribute 
            writer.Write(name)
            writer.Write("=\"")
            writer.Write(value)
            writer.Write("\" ")
            self :> IHtmlFormatter

        member self.closeTag () = 
            if canSelfClose then
                writer.Write("/>")
                tagStack.Pop() |> ignore
            else
                writer.Write("</")
                writer.Write(tagStack.Pop())
                writer.Write('>')

            canSelfClose <- false // если есть открытые теги, то они не могут быть самозакрываемыми, т.к. мы тьлько что завершили добавление дочернего тега

            self :> IHtmlFormatter

module HttpResponse =

    let createHtmlFormatter (httpResponse : System.Web.HttpResponse) = HtmlTextWriterFormatter httpResponse.Output :> IHtmlFormatter